package com.cmd.project.util;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.ZipUtil;
import com.cmd.common.constant.Constants;
import com.cmd.common.exception.ServiceException;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * @author cq
 * @date 2024/11/14
 */

public class DecompressUtil {

    /**
     * 解压压缩包
     *
     * @param uploadFile  web上传的压缩包
     * @param packFileStr 压缩包保存路径
     */
    public static String decompress(MultipartFile uploadFile, String packFileStr) {

        //不存在则创建
        File packFile = new File(packFileStr);
        if (!packFile.exists()) {
            packFile.mkdirs();
        }
        if (uploadFile == null) {
            throw new ServiceException("请上传文件");
        }
        String filename = Optional.ofNullable(uploadFile.getOriginalFilename()).orElse("");
        if (filename.contains(Constants.ZIP_FILE)) {
            //zip解压缩处理
        } else {
            throw new ServiceException("上传的压缩包格式不正确,仅支持zip压缩文件!");
        }
        int lastIndex = filename.lastIndexOf('.');
        String fileName = "";
        // 如果文件名中存在点（.），则返回去除后缀后的文件名部分；否则直接返回原文件名
        if (lastIndex > 0 && lastIndex < filename.length() - 1) {
            fileName = filename.substring(0, lastIndex);
        } else {
            fileName = filename;
        }
        try (InputStream inputStream = uploadFile.getInputStream()) {
            // 使用Hutool的ZipUtil解压文件到指定目录
            ZipUtil.unzip(inputStream, packFile, CharsetUtil.CHARSET_GBK);
//            File unzipDir = new File(packFile, fileName);
//            File[] filesAndDirs = unzipDir.listFiles();
//            if (filesAndDirs != null) {
//                List<File> filesToMove = new ArrayList<>();
//                for (File fileOrDir : filesAndDirs) {
//                    filesToMove.add(fileOrDir);
//                }
//                // 将这些文件和子文件夹移动到目标目录下，并删除多出来的那层文件夹
//                for (File fileToMove : filesToMove) {
//                    FileUtil.move(fileToMove, packFile, true);
//                }
//                FileUtil.del(unzipDir);
//            }
        } catch (Exception e) {
            throw new RuntimeException("解压失败!");
        }
        return packFileStr+"/"+fileName;
    }

}
